#pragma once

#include <string>
#include <unordered_map>
#include <vector>
#include "order.h"
#include "position.h"

namespace hft {

// 全局风控限制
struct GlobalRiskLimits {
    double max_position_value = 0.0;     // 最大持仓市值
    double max_daily_loss = 0.0;         // 最大日亏损
    double max_leverage = 0.0;           // 最大杠杆率
    int max_order_size = 0;              // 最大订单数量
    int max_daily_orders = 0;            // 最大日订单数
    double max_order_value = 0.0;        // 最大订单金额
    double max_position_concentration = 0.0; // 最大持仓集中度
};

// 合约风控限制
struct ContractRiskLimits {
    double max_position_value = 0.0;     // 最大持仓市值
    double max_daily_loss = 0.0;         // 最大日亏损
    double max_leverage = 0.0;           // 最大杠杆率
    int max_order_size = 0;              // 最大订单数量
    int max_daily_orders = 0;            // 最大日订单数
    double max_order_value = 0.0;        // 最大订单金额
    double price_limit_percent = 0.0;    // 价格涨跌幅限制
};

// 风控配置
struct RiskConfig {
    GlobalRiskLimits global_limits;
    std::unordered_map<std::string, ContractRiskLimits> contract_limits;
};

// 风控检查结果
struct RiskCheckResult {
    bool passed = true;
    std::string reason;
};

class RiskManager {
public:
    // 构造函数
    RiskManager(const RiskConfig& config);
    
    // 加载风控配置
    bool loadConfig(const std::string& config_file);
    
    // 保存风控配置
    bool saveConfig(const std::string& config_file);
    
    // 检查订单
    RiskCheckResult checkOrder(const Order& order);
    
    // 检查持仓
    RiskCheckResult checkPosition(const Position& position);
    
    // 设置账户余额
    void setAccountBalance(const std::string& account, double balance);
    
    // 设置合约价格
    void setContractPrice(const std::string& symbol, double price);
    
    // 更新日交易统计
    void updateDailyStats(const Trade& trade);
    
    // 重置日交易统计
    void resetDailyStats();
    
    // 获取风控配置
    const RiskConfig& getConfig() const;
    
    // 更新风控配置
    void updateConfig(const RiskConfig& config);

private:
    // 检查全局风控限制
    RiskCheckResult checkGlobalLimits(const Order& order);
    
    // 检查合约风控限制
    RiskCheckResult checkContractLimits(const Order& order);
    
    // 检查账户风控限制
    RiskCheckResult checkAccountLimits(const Order& order);
    
    // 计算订单价值
    double calculateOrderValue(const Order& order);

private:
    // 风控配置
    RiskConfig config_;
    
    // 账户余额映射表
    std::unordered_map<std::string, double> account_balances_;
    
    // 合约价格映射表
    std::unordered_map<std::string, double> contract_prices_;
    
    // 日订单数量统计
    std::unordered_map<std::string, int> daily_order_counts_;
    
    // 日亏损统计
    std::unordered_map<std::string, double> daily_losses_;
};

} // namespace hft